package com.intct.hbase.dml;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.RegexStringComparator;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * @author gufg
 * @since 2025-07-11 11:17
 */
public class ScanDataImpl extends AbsDMLBase{
    @Override
    public void execCommand(Table table) throws IOException {
        Scan scan = new Scan();
        //
        scan.withStartRow(Bytes.toBytes("1001"), true);
        scan.withStopRow(Bytes.toBytes("1003"), true);

        // 查询指定版本数量
//        scan.readVersions(3);

        // 查询全部分版本
//        scan.readAllVersions();

        /* HBase提供过滤条件类
            SingleColumnValueFilter         单值过滤
            PrefixFilter                    前缀过滤
            SingleColumnValueExcludeFilter  单值过滤(不包含)
            ColumnValueFilter               值过滤
            FamilyFilter                    列族过滤
            QualifierFilter                 列限定符过滤
            RowFilter                       主键(rowkey)过滤
            PageFilter                      分页过滤
            ValueFilter                     值过滤
         */

        // 单值过滤器创建
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
                // 列族名称
                Bytes.toBytes("f1"),
                // 列限定符
                Bytes.toBytes("name"),
                // 比较符
                CompareOperator.EQUAL,
                // 值
                Bytes.toBytes("wangwu")
        );

        // 主键过滤器
        RegexStringComparator regexStringComparator = new RegexStringComparator("100.*");
        RowFilter rowFilter = new RowFilter(CompareOperator.EQUAL, regexStringComparator);

        // 多过滤器组合
        FilterList filterList = new FilterList();
        filterList.addFilter(singleColumnValueFilter);
        filterList.addFilter(rowFilter);

        // 设置过滤器
        scan.setFilter(filterList);

        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            String rowkey = Bytes.toString(result.getRow());
            System.out.println("主键==" + rowkey);
            // 列族名称：列限定符：值
            Cell[] cells = result.rawCells();

            for (Cell cell : cells) {
                // 列族名称
                String family = Bytes.toString(CellUtil.cloneFamily(cell));
                // 列限定符（列名）
                String columName = Bytes.toString(CellUtil.cloneQualifier(cell));
                // 值
                String value = Bytes.toString(CellUtil.cloneValue(cell));

                System.out.println("列族名称 = " + family + "; 列名 = " + columName + "; 值 = " + value);
            }
        }
    }

    public static void main(String[] args) throws IOException {
        new ScanDataImpl().start("intct82", "t001");
    }
}
